package fr.dauphine.bookstore.backoffice.user;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Session;

import fr.dauphine.bookstore.backoffice.SessionUtil;
import fr.dauphine.bookstore.commun.MessagesUtil;
import fr.dauphine.bookstore.hibernate.HibernateUtil;
import fr.dauphine.bookstore.modele.User;

/**
 * Ajout et modification d'un utilisateur.
 */
public final class SaveUserServlet extends HttpServlet {

	/**
	 * Serial version UID.
	 */
	private static final long serialVersionUID = 5347836201142869831L;

	/**
	 * Traite la methode POST.
	 * 
	 * @param request
	 *            Requete
	 * @param response
	 *            Reponse
	 * @throws ServletException
	 *             Erreur de servlet
	 * @throws IOException
	 *             Erreur d'entree/sortie
	 */
	protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
		User user = SessionUtil.getUser(request.getSession());

		retreiveUserName(request, user);
		retreiveLastName(request, user);
		retreiveFirstName(request, user);
		retreiveEmail(request, user);
		retreiveAdmin(request, user);

		if (user.getId() == null) {
			retreivePassword(request, user);
		}

		// On sauvegarde
		if (!MessagesUtil.isThereErrors(request)) {
			
			// Hash du mot de passe (seulement en creation)
			if (user.getId() == null) {
				user.setPassword(DigestUtils.md5Hex(user.getPassword()));
			}
			
			Session hSession = HibernateUtil.getSessionFactory().getCurrentSession();
			hSession.saveOrUpdate(user);
			SessionUtil.removeUser(request.getSession());

			response.sendRedirect("users.jsp");

			// On retourne sur la page de modification
		} else {
			request.getRequestDispatcher("editUser.jsp").forward(request, response);
		}
	}

	/**
	 * Recupere le flag d'administrateur dans la requete.
	 * 
	 * @param request
	 *            Requete
	 * @param user
	 *            Utilisateur
	 */
	private void retreiveAdmin(final HttpServletRequest request, final User user) {
		Boolean admin = BooleanUtils.toBoolean(request.getParameter("admin"));

		user.setAdmin(admin);
	}

	/**
	 * Recupere l'email dans la requete.
	 * 
	 * @param request
	 *            Requete
	 * @param user
	 *            Utilisateur
	 */
	private void retreiveEmail(final HttpServletRequest request, final User user) {
		user.setEmail(request.getParameter("email"));

		if (StringUtils.isEmpty(user.getEmail())) {
			MessagesUtil.addMessage(request, MessagesUtil.ERROR, "L'adresse e-mail est obligatoire");
		}
	}

	/**
	 * Recupere le nom dans la requete.
	 * 
	 * @param request
	 *            Requete
	 * @param user
	 *            Utilisateur
	 */
	private void retreiveLastName(final HttpServletRequest request, final User user) {
		user.setLastName(request.getParameter("lastName"));

		if (StringUtils.isEmpty(user.getLastName())) {
			MessagesUtil.addMessage(request, MessagesUtil.ERROR, "Le nom est obligatoire");
		}
	}

	/**
	 * Recupere le prenom dans la requete.
	 * 
	 * @param request
	 *            Requete
	 * @param user
	 *            Utilisateur
	 */
	private void retreiveFirstName(final HttpServletRequest request, final User user) {
		user.setFirstName(request.getParameter("firstName"));

		if (StringUtils.isEmpty(user.getFirstName())) {
			MessagesUtil.addMessage(request, MessagesUtil.ERROR, "Le prenom est obligatoire");
		}
	}

	/**
	 * Recupere le mot de passe dans la requete.
	 * 
	 * @param request
	 *            Requete
	 * @param user
	 *            Utilisateur
	 */
	private void retreivePassword(final HttpServletRequest request, final User user) {
		user.setPassword(request.getParameter("password"));

		if (StringUtils.isEmpty(user.getPassword())) {
			MessagesUtil.addMessage(request, MessagesUtil.ERROR, "Le mot de passe est obligatoire");
		}
	}

	/**
	 * Recupere le nom d'utilisateur dans la requete.
	 * 
	 * @param request
	 *            Requete
	 * @param user
	 *            Utilisateur
	 */
	private void retreiveUserName(final HttpServletRequest request, final User user) {
		user.setUserName(request.getParameter("userName"));

		if (StringUtils.isEmpty(user.getUserName())) {
			MessagesUtil.addMessage(request, MessagesUtil.ERROR, "Le nom d'utilisateur est obligatoire");
		}
	}
}
